/**
 * @title HHAdminModel.java 
 * @description 	后台管理模块基类文件
 * @create 			2012-7-18 下午09:12:39 By xjiujiu
 * @package 		apps.admin.model
 * @copyright 		Copyright (c) 2011-2012 http://xyrj.hhtc.edu.cn.com. All right reserved
 * @version         $Id$
 * XYRJ-Java-Project
 */

package apps.admin.model;

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import system.config.HHConfig;


import com.xyrj.core.HHPojo;
import com.xyrj.exception.HHPojoException;
import com.xyrj.exception.HHSqlException;
import com.xyrj.mvc.HHModel;
import com.xyrj.sql.HHWhereType;
import com.xyrj.utils.HHPojoUtils;
import com.xyrj.utils.HHString;


/** 
 * 后台管理模块基类
 * 
 * 对后台管理模块里的属性及方法的抽象提取
 * 
 * @classname 	HHAdminModel 
 * @author 		xjiujiu<xjiujiu@foxmail.com>
 * @date 		2012-7-18 下午09:12:39 
 * @version 	1.0
 */
public abstract class HHModelBaseModel extends HHModel
{
	
	/**
	 * 构造函数
	 * 
	 * 初始化类里成员
	 */
	public HHModelBaseModel()
	{
		super();
	}	
	
	/**
	 * 得到模块信息列表
	 *  
	 * @description
	 * 
	 * @title  getList
	 * @param  page 页码
	 * @param  perpage 每页显示的信息条数 
	 * @return ArrayList
	 */
	@SuppressWarnings("rawtypes")
    public List<Map> getList(int page, int perpage)
	{
		this._sql.table(this._pojo.table)
		.fields(HHPojoUtils.getShowListFields(this._pojo))
		.orderBy(HHPojoUtils.getOrderByFields(this._pojo))
		.limit(page, perpage);
		
		return this._db.find(this._sql.getSelectSql());
	}
	
	/**
	 * 通过ID得到记录
	 *  
	 * @description
	 * 
	 * @title  getRecordById
	 * @param  recordId 当前的记录ID
	 * @return Map 当前的记录信息
	 */
	@SuppressWarnings("rawtypes") 
    public Map getRecordById(Object recordId)
	{
		this._sql.table(this._pojo.table)
		.fields("*")
		.where(new String[] {"`" + this._pojo.modelEnName +  "_id` = '" + recordId + "'"});
		
		List<Map> list 		= this._db.find(this._sql.getSelectSql());
		if(null == list) {
			return null;
		}
		
		return list.get(0);
	}
	
	/**
	 * 添加记录
	 *  
	 * @description
	 * 
	 * @title  add
	 * @param  pojo 当前模块实体的配置对象
	 * @return int 影响的行数
	 * @throws HHSqlException 
	 */
	public int add(HHPojo pojo)
	{
		try {
			return (Integer)this._db.savePojo(pojo);
		} catch(Exception ex) {
			return 0;
		}
	}

	/**
	 * 编辑记录
	 *  
	 * @description
	 * 
	 * @title  edit
	 * @param  pojo 需要更新的记录POJO对象
	 * @return int 当前更新影响的行数
	 */
	public int edit(HHPojo pojo)
	{
		this._sql.table(pojo.table)
		.fields(this._getFieldsOnEdit(pojo))
		.values(this._getValuesOnEdit(pojo))
		.where(
			"`" + this._pojo.modelEnName + "_id`=" +
			pojo.getField(this._pojo.modelEnName + "_id")
		);
		try {
			return this._db.update(this._sql.getUpdateSql());
		} catch(HHSqlException ex) {
			if(HHConfig.DEBUG) {
				ex.printStackTrace();
			}
			return 0;
		}
	}

	/**
	 * 删除对应的记录
	 *  
	 * @description
	 * 
	 * @title  delete
	 * @param  recordId 当前的记录ID
	 * @return int 影响的行数
	 */
	public int delete(Object recordId)
	{
		this._sql.table(this._pojo.table)
		.where("`" + this._pojo.modelEnName + "_id`=" + recordId);
		try {
			return this._db.update(this._sql.getDeleteSql());
		} catch(HHSqlException ex) {
			if(HHConfig.DEBUG) {
				ex.printStackTrace();
			}
			return 0;
		}
	}

	/**
	 * 根据指定的记录ID来更新对应的字段
	 *  
	 * @description
	 * 
	 * @title  updateFieldsById
	 * @param  fields 字段集
	 * @param  values 字段对应的值
	 * @param  recordIds 当前的总记录ID
	 * @return int 影响的行数
	 */
	public int updateFieldById(String [] fields,
			String [] values, String[] recordIds)
	{
		try {
			this._sql.table(this._pojo.table)
			.pk(this._pojo.modelEnName + "_id")
			.fields(fields)
			.values(values)
			.where(recordIds);
			return this._db.update(this._sql.getUpdateSql(HHWhereType.PK_OR));
		} catch(HHSqlException ex) {
			if(HHConfig.DEBUG) {
				ex.printStackTrace();
			}
			return 0;
		}
	}

	/**
	 * 对传参数都是字符串的重载
	 *  
	 * @description
	 * 
	 * @title  updateFieldById
	 * @param  field 当前需要操作的字段 
	 * @param  value 当前字段对应的值
	 * @param  recordIds 当前的ID
	 * @return int 影响的行数
	 */
	public int updateFieldById(String field, String value, String recordIds)
	{
		return this.updateFieldById(
			new String[] {field},
			new String [] {value},
			new String [] {recordIds}
		);
	}

	/**
	 * 对传参数不全是字符串的重载
	 *  
	 * @description
	 * 
	 * @title  updateFieldById
	 * @param  field 当前需要操作的字段 
	 * @param  value 当前字段对应的值
	 * @param  recordIds 当前的ID
	 * @return int 影响的行数
	 */
	public int updateFieldById(String field, String value, String[] recordIds)
	{
		return this.updateFieldById(
			new String[] {field},
			new String [] {value},
			recordIds
		);
	}
	
	/**
	 * 得到添加时的字段
	 *  
	 * 由于integer/datetime这类的字段不能用''来代替，所以去掉了
	 * 值为空的字段，只有值不为空的字段才参与添加操作
	 * 
	 * @title  _getFieldsOnAdd
	 * @param  pojo 当前需要添加的字段
	 * @return String[]
	 */
    protected String [] _getFieldsOnAdd(HHPojo pojo)
	{
		LinkedList<String> list 	= new LinkedList<String>();
		@SuppressWarnings("rawtypes")
        Iterator fields 			= pojo.getFields();
		while(fields.hasNext()) {
			String field 	= (String)fields.next();
			if(null != pojo.getField(field) &&
				!pojo.getField(field).equals("")) {
				list.add(field);
			}
		}	
		
		return list.toArray(new String[list.size()]);
	}

	/**
	 * 得到添加字段对应的值
	 *  
	 * 这里去掉了值为空的值
	 * 
	 * @title  _getValuesOnAdd
	 * @param  pojo 操作的值对象
	 * @return String[]
	 */
	protected String [] _getValuesOnAdd(HHPojo pojo)
	{
		LinkedList<String> list 	= new LinkedList<String>();
		@SuppressWarnings("rawtypes")
        Iterator fields 			= pojo.getFields();
		while(fields.hasNext()) {
			String field 	= (String)fields.next();
			if(null != pojo.getField(field) &&
				!pojo.getField(field).equals("")) {
				list.add(pojo.getField(field).toString());
			}
		}	
		
		return list.toArray(new String[list.size()]);
	}
	
	/**
	 * 得到编辑时的字段
	 *  
	 * 数据库查出来的数据是所有的字段，所以这里更新的也就是所有的字段
	 *
	 * @title  _getFieldsOnEdit
	 * @param  pojo 当前需要更新的字段
	 * @return String[]
	 */
    protected String [] _getFieldsOnEdit(HHPojo pojo)
	{
		LinkedList<String> list 	= new LinkedList<String>();
		List<String> primaryKeys 	= Arrays.asList(HHPojoUtils.getPrimaryKey(this._pojo));
		@SuppressWarnings("rawtypes")
        Iterator fields 			= pojo.getFields();
		while(fields.hasNext()) {
			String field 	= (String)fields.next();
			if(null != pojo.getField(field) && !primaryKeys.contains(field)) {
				list.add(field);
			}
		}	
		
		return list.toArray(new String[list.size()]);
	}

	/**
	 * 得到编辑动作字段对应的值
	 *  
	 * 数据库查出来的数据是所有的字段，所以这里更新的也就是所有的字段值
	 * 
	 * @title  _getValuesOnEdit
	 * @param  pojo 操作的值对象
	 * @return String[]
	 */
	protected String [] _getValuesOnEdit(HHPojo pojo)
	{
		LinkedList<String> list 	= new LinkedList<String>();
		@SuppressWarnings("rawtypes")
        Iterator fields 			= pojo.getFields();
		List<String> primaryKeys 	= Arrays.asList(HHPojoUtils.getPrimaryKey(pojo));
		while(fields.hasNext()) {
			String field 	= (String)fields.next();
			if(null != pojo.getField(field) && !primaryKeys.contains(field)) {
				list.add(pojo.getField(field).toString());
			}
		}	
		
		return list.toArray(new String[list.size()]);
	}
	
	/**
	 * 得到搜索的记录集
	 *  
	 * @description
	 * 
	 * @title  getSearchList
	 * @param  keyword 关键字
	 * @param  page 当前页
	 * @param  perpage 每页显示的记录条数
	 * @return List<Map> 查找到的结果集
	 * @throws HHPojoException POJO文件配置不正确异常
	 */
	@SuppressWarnings("rawtypes")
    public List<Map> getSearchList(String keyword, int page, int perpage)
    		throws HHPojoException
	{
		this._sql.table(this._pojo.table)
		.fields(HHPojoUtils.getShowListFields(this._pojo))
		.orderBy(HHPojoUtils.getOrderByFields(this._pojo))
		.where(this.getSearchWhere(keyword))
		.limit(page, perpage);
		
		return this._db.find(this._sql.getSelectSql());
	}
	
	/**
	 * 得到搜索的条件SQL部分
	 *  
	 * @description
	 * 
	 * @title  _getSearchWhere
	 * @param  keyword 当前的搜索关键字
	 * @return String 条件结果
	 * @throws HHPojoException POJO文件配置异常
	 */
	public String getSearchWhere(String keyword) throws HHPojoException
	{
		if(true == HHString.isMatcher("^/\\d$", keyword)) {
			return "`" + this._getPrimaryKey() + "` = '" + keyword.substring(1) + "'";
		}
		
		return HHString.arrayToString(
			HHPojoUtils.getSearchFields(this._pojo),
			"`",
			 "` like '%" + keyword + "%' OR ",
			 0) + "1 = 2";
	}
	
}
